package pro.bbs.view;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import pro.bbs.view.interceptor.SessionInterceptor;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * <p>
 * 论坛模块显示项目，主要是放页面
 * </p>
 *
 * @author 杨阳
 * @since 2017年10月19日
 */
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableSwagger2
@ImportResource(locations = {"classpath:*spring/spring-*.xml"})
@EnableFeignClients
// 在启动类加入 @EnableDiscoveryClient注解，声明这是一个Eureka Client。
// 也可以使用@EnableEurekaClient代替@EnableDiscoveryClient注解，在spring cloud中服务发现组件有多种选择，例如：Zookeeper、Consul等。
// @EnableDiscoveryClient为各种服务组件均提供了支持，访问注解是spring-cloud-commons项目的注解，是一个高度的抽象；
// 而@EnableEurekaClient表明是Eureka的client，该注解是spring-cloud-netflix项目中的注解，只能与Eureka一起工作。
// 当Eureka在项目的classpath是，两个注解是没有区别的。
@EnableDiscoveryClient
public class Application extends WebMvcConfigurerAdapter {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    /**
     * <p>
     * 增加session拦截器，判断用户是否登陆
     * </p>
     *
     * @author 杨阳
     * @since 2017年9月1日
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // session拦截器
        registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

    /**
     * <p>
     * 注册一个远程调用模板，主要负责文件上传，其它调用还是使用feign接口
     * </p>
     *
     * @return {@link RestTemplate}
     */
    @Bean(name = "restTemplate")
    //负载均衡
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
